import config from "./config.js"

// HTTP 状态码
const httpCodeMessage = {
  200: "服务器成功返回请求的数据。",
  201: "新建或修改数据成功。",
  202: "一个请求已经进入后台排队（异步任务）。",
  204: "删除数据成功。",
  400: "发出的请求有错误，服务器没有进行新建或修改数据的操作。",
  401: "用户没有权限（令牌、用户名、密码错误）。",
  403: "用户得到授权，但是访问是被禁止的。",
  404: "发出的请求针对的是不存在的记录，服务器没有进行操作。",
  406: "请求的格式不可得。",
  410: "请求的资源被永久删除，且不会再得到的。",
  422: "当创建一个对象时，发生一个验证错误。",
  500: "服务器发生错误，请检查服务器。",
  502: "网关错误。",
  503: "服务不可用，服务器暂时过载或维护。",
  504: "网关超时。",
};

// 错误码
const miniCodeMessage = {
  11: "无权跨域。",
  12: "网络出错。",
  13: "超时。",
  14: "解码失败。",
  19: "HTTP错误。",
  20: "请求已被停止/服务端限流。",
};

/**
 * description: 网络请求封装
 * author: 83
 * createTime: 2021-11-5 3:09:20 ?F10: PM?
 * @param {object} options request参数
 * @return {Promise}
 */
const request = function (options) {
  return new Promise((resolve, reject) => {
		// 成功
		const success = function (response) {
			const { statusCode, data } = response;
			if (statusCode >= 200 && statusCode < 300) {
				resolve(data);
			} else {
				reject({
					error: statusCode,
					errorMessage: data.message || httpCodeMessage[statusCode],
				});
			}
		}
		// 失败
		const fail = function (response) {
			const { error, errorMessage = miniCodeMessage[error] } = response;
			my.showToast({
				type: "exception",
				content: errorMessage,
				duration: 3000,
			});
			reject({
				error,
				errorMessage,
			});
		}
		// 请求配置
		const requestConfig = {
		  ...options,
		  success,
		  fail,
		};

    uni.request(requestConfig);
  });
}

// 请求拦截器
uni.addInterceptor('request', {
	// 请求前触发
  invoke(options) {
    options.url = config.baseApi + options.url
  },
	// 请求成功后
  success(options) {
    options.data.code = 1
  },
  fail(err) {
    console.log('interceptor-fail',err)
  },
})

export default request
